//package com.zhihuiyanche.common.filter;
//
//import java.io.IOException;
//import java.sql.Timestamp;
//import java.util.List;
//import java.util.Map;
//
//import javax.servlet.Filter;
//import javax.servlet.FilterChain;
//import javax.servlet.FilterConfig;
//import javax.servlet.ServletException;
//import javax.servlet.ServletRequest;
//import javax.servlet.ServletResponse;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//
//import net.sf.json.JSONObject;
//
//import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
//import org.apache.commons.httpclient.HttpClient;
//import org.apache.commons.httpclient.HttpStatus;
//import org.apache.commons.httpclient.methods.GetMethod;
//import org.apache.commons.httpclient.params.HttpMethodParams;
//import org.apache.commons.httpclient.util.DateUtil;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.log4j.Logger;
//import org.codehaus.jackson.JsonNode;
//import org.codehaus.jackson.map.ObjectMapper;
//
//import com.zhihuiyanche.common.constant.Constant;
//import com.zhihuiyanche.common.util.FromRedisUtil;
//import com.zhihuiyanche.common.util.MyUtil;
//import com.zhihuiyanche.common.util.SpringConext;
//import com.zhihuiyanche.common.util.WXConfig;
//import com.zhihuiyanche.common.util.WXThridConfig;
//import com.zhihuiyanche.common.util.WXThridUtil;
//import com.zhihuiyanche.common.util.WXUtil;
//import com.zhihuiyanche.common.util.WechatTokenUtil;
//
///**
// * 1銆佹嫤鎴猣ront鏂囦欢澶逛笅鐨刯sp椤甸潰 2銆佸垽鏂璼ession涓殑tenantId涓巖equest涓殑鍙傛暟鏄惁涓�嚧
// * 3銆乼enantId濡傛灉涓�嚧锛屾煡璇ession涓璷penid鏄惁鏈夊�
// * 銆佹湁鍊煎彲浠ョ洿鎺ヨ繘琛岃闂紝濡傛灉session涓笉瀛樺湪鍊笺�杩涜鎺堟潈璺宠浆鍘昏幏鍙杘penid銆佸瓨鍏ession
// * 4銆乼enantId濡傛灉涓嶄竴鑷达紝鎸夌収url涓殑tenantId涓烘爣鍑�
// * 銆佹洿鏂皊ession涓殑tenantId淇℃伅銆傜劧鍚庤繘琛屾巿鏉冭幏鍙杘penid銆佸瓨鍏ession
// */
//// @WebFilter("*.jsp")
//public class OpenIdFilter implements Filter
//{
//	// String LOGIN_PAGE = "/index.jsp";
//	protected FilterConfig		filterConfig;
//
//	private static final String	SESSION_USER_KEY	= "session_wechat_user";
//	private Logger				logger				= Logger.getRootLogger();
//
//	private final static String	COMPONENT_APPID		= Constant.getSystemMap().get("wechat_component_appid");
//
//	public OpenIdFilter()
//	{
//		super();
//	}
//
//	public void init(FilterConfig config) throws ServletException
//	{
//		// as comment servlet Filter can get init
//		this.filterConfig = config;
//	}
//
//	/*
//	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
//	 * javax.servlet.ServletResponse, javax.servlet.FilterChain)
//	 */
//	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
//	{
//		logger.debug("+++++++++++++++++++++OpenIdFilter+++++++++++++++++++++++++");
//		HttpServletRequest httpRequest = (HttpServletRequest) req;
//		HttpServletResponse httpResponse = (HttpServletResponse) res;
//		String request_uri = httpRequest.getRequestURI();
//		String ctx_path = httpRequest.getContextPath();
//		String url = httpRequest.getRequestURL().toString();
//		if (httpRequest.getQueryString() != null)
//		{
//			url = url + "?" + httpRequest.getQueryString();
//		}
//		// 鍙繃婊sp 褰撳寘鍚玶edirectUri 鍙傛暟锛岃鏄庢槸璺宠浆鍒板叾瀹冮〉闈�鍙渶鎶婅彍鍗昳d浼犺繃鍘诲嵆鍙�
//		if (request_uri.indexOf("front") == -1 || url.contains("redirectUri") || request_uri.indexOf(".jsp") == -1)
//		{
//			chain.doFilter(req, res);
//			return;
//		}
//		httpRequest.setAttribute("url", url);
//
//		String openId = (String) httpRequest.getSession().getAttribute("openId");
//		String tenantId = (String) httpRequest.getSession().getAttribute("tenantId");
//		String paramTenantId = req.getParameter("tenantId");
//		/**
//		 * 瀵规瘮session鍜寀rl閾炬帴涓惡甯︾殑鍙傛暟锛岀浉鍚屼笉鍋氬鐞嗐�涓嶇浉鍚岀殑璇濇寜鐓rl涓殑鍊间负鏍囧噯杩涜澶勭悊
//		 * 涓轰簡瑙ｅ喅鍦ㄥ悓涓�釜鍩熷悕涓嬶紝鐢ㄦ埛鎵撳紑涓嶅悓鍟嗘埛搴旂敤鏃朵娇鐢ㄥ悓涓�essionid瀵艰嚧鍟嗘埛淇℃伅绱婁贡鐨勯棶棰�
//		 */
//		if (MyUtil.checkEmpty(paramTenantId))
//		{
//			if (!MyUtil.checkEmpty(tenantId) || !tenantId.equals(paramTenantId))
//			{
//				httpRequest.getSession().setAttribute("tenantId", paramTenantId);
//				tenantId = paramTenantId;
//				openId = null;
//				httpRequest.getSession().setAttribute("openId", openId);
//			}
//		}
//		// 鑾峰彇杞彂鐨剆tate menu111_hdl褰㈠紡 hdl涓簍enantId 111 涓簃enu鐨刬d锛岀敤鏉ョ粺璁�
//		// 绗笁鏂箂tate鏄互menu111_hdl_WXDiSanFang褰㈠紡瀛樺湪
//		String state = req.getParameter("state");
//		String wxThrild = state;
//		logger.debug("+++++++++++++state++++++++++++++:" + state);
//		String menuId = "";
//		// 濡傛灉涓嶄负绌�璇存槑鏄偣鍑昏彍鍗曡繘鏉ャ�
//		if (null != state && !"".equals(state) && state.contains("menu"))
//		{
//			String[] states = state.split("_");
//			if (states.length > 2)
//			{
//				wxThrild = states[2];
//			}
//			state = states[0];
//			menuId = state.substring(4, state.length());
//			httpRequest.getSession().setAttribute("menuId", menuId);
//			state = states[1];
//			/**
//			 * 瀵规瘮session鍜寀rl閾炬帴涓惡甯︾殑鍙傛暟锛岀浉鍚屼笉鍋氬鐞嗐�涓嶇浉鍚岀殑璇濇寜鐓rl涓殑鍊间负鏍囧噯杩涜澶勭悊
//			 * 涓轰簡瑙ｅ喅鍦ㄥ悓涓�釜鍩熷悕涓嬶紝鐢ㄦ埛鎵撳紑涓嶅悓鍟嗘埛搴旂敤鏃朵娇鐢ㄥ悓涓�essionid瀵艰嚧鍟嗘埛淇℃伅绱婁贡鐨勯棶棰�
//			 */
//			if (!MyUtil.checkEmpty(tenantId))
//			{
//				httpRequest.getSession().setAttribute("tenantId", state);
//				tenantId = state;
//			}
//			else if (!state.equals(tenantId))
//			{
//				httpRequest.getSession().setAttribute("tenantId", state);
//				tenantId = state;
//				openId = null;
//			}
//		}
//
//		// ===============TODO 鏈湴娴嬭瘯浣跨敤浠ｇ爜銆佹彁浜や唬鐮佹椂闇�娉ㄩ噴鎺�start===============
//		/*
//		 * String paramOpenId = req.getParameter("openId");
//		 * if(MyUtil.checkEmpty(paramOpenId)){ openId = paramOpenId;
//		 * httpRequest.getSession().setAttribute("openId", openId); }
//		 */
//		// ===============鏈湴娴嬭瘯浣跨敤浠ｇ爜銆佹彁浜や唬鐮佹椂闇�娉ㄩ噴鎺�end======================
//		// 濡傛灉姝ゆ椂tenantId涓虹┖锛岀洿鎺ヨ烦鍑�
//		if (!MyUtil.checkEmpty(tenantId))
//		{
//			// 鏉′欢涓嶈冻 璺冲嚭
//			httpResponse.sendRedirect(ctx_path + "/error.jsp");
//			return;
//		}
//		// 鍟嗘埛鍙峰拰openid閮戒笉涓虹┖锛屽彲浠ョ户缁闂�
//		if (MyUtil.checkEmpty(openId) && MyUtil.checkEmpty(tenantId))
//		{
//			checkWebchatUser(tenantId, openId, req);
//			chain.doFilter(req, res);
//			return;
//		}
//		// 閫氳繃寰俊杞彂閾炬帴杩涘叆锛屾牴鎹熀纭�帴鍙ｈ幏鍙杘penId
//		String code = req.getParameter("code");
//		logger.debug("+++++++++++++++++++code+++++++++++++++++:" + code);
//		// String state = req.getParameter("state");
//		// tenantId涓嶄负绌猴紝鍗冲彲鑳戒负鍒嗕韩鍑哄幓鐨勯摼鎺�
//		if (!StringUtils.isEmpty(tenantId))
//		{
//			state = tenantId;
//		}
//		if (MyUtil.checkEmpty(code) && MyUtil.checkEmpty(state))
//		{
//			if (code.equalsIgnoreCase("authdeny"))
//			{
//				// 涓嶆弧瓒充笂杩帮紝璇佹槑涓嶆槸鍦ㄥ井淇′腑浣跨敤锛岃烦鍑�
//				httpResponse.sendRedirect(ctx_path + "/authDeny.jsp");
//				return;
//			}
//			else if (null != wxThrild && !"".equals(wxThrild) && "WXDiSanFang".equals(wxThrild))
//			{
//				// String appId = wxThrild.split(",")[1];
//				logger.debug("寰俊绗笁鏂规巿鏉冿紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒");
//				// System.out.println("寰俊绗笁鏂规巿鏉冿紒锛侊紒锛侊紒锛侊紒锛侊紒锛侊紒");
//				HttpClient client = new HttpClient();
//				String authorizer_appid = WXThridConfig.getAppId(state);
//				// String appSecret = WXConfig.getAppSecret(state);
//				String component_access_token = (String) FromRedisUtil.getComponentAccessToken("component_access_token");
//				// logger.debug("appId:"+authorizer_appid);
//				// JSONObject accessToken =
//				// WechatThridTokenUtil.getAccessToken(authorizer_appid,
//				// COMPONENT_APPID, code, component_access_token);
//				// logger.debug("accessToken:"+accessToken);
//				// openId=accessToken.getString("openid");
//				logger.debug("code++++++++++++:" + code);
//				// System.out.println("code++++++++++++:"+code);
//				// https://api.weixin.qq.com/sns/oauth2/component/access_token?appid="+authorizer_appid+"&code="+code+"&grant_type=authorization_code&component_appid="+COMPONENT_APPID+"&component_access_token=COMPONENT_ACCESS_TOKEN
//				GetMethod method = new GetMethod("https://api.weixin.qq.com/sns/oauth2/component/access_token?appid=" + authorizer_appid + "&code=" + code + "&grant_type=authorization_code&component_appid=" + COMPONENT_APPID + "&component_access_token=" + component_access_token);
//				method.setRequestHeader("Connection", "close");
//				method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
//				// Execute the method.
//				try
//				{
//					int statusCode = client.executeMethod(method);
//					if (statusCode != HttpStatus.SC_OK)
//					{
//						chain.doFilter(req, res);
//						if (method != null)
//						{
//							method.releaseConnection();
//							client.getHttpConnectionManager().closeIdleConnections(0);
//						}
//						return;
//					}
//					// Read the response body.
//					String respStr = method.getResponseBodyAsString();
//					JSONObject rootNode = JSONObject.fromObject(respStr);
//					logger.debug("rootNode++++++++++++++++:" + rootNode);
//					// System.out.println("node+++++++锛�+node);
//					// 鑾峰彇涓嶅埌锛屽弬鏁伴敊璇垨娌″湪寰俊涓娇鐢�
//					if (rootNode != null)
//					{
//						openId = rootNode.optString("openid");
//						httpRequest.getSession().setAttribute("openId", openId);
//						httpRequest.getSession().setAttribute("tenantId", state);
//						checkWebchatUser(state, openId, req);
//					}
//					else
//					{
//						httpResponse.sendRedirect(ctx_path + "/error.jsp");
//						return;
//					}
//					if (method != null)
//					{
//						method.releaseConnection();
//						client.getHttpConnectionManager().closeIdleConnections(0);
//					}
//				}
//				catch (Exception e)
//				{
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//				finally
//				{
//					// Release the connection.
//					if (method != null)
//					{
//						method.releaseConnection();
//						client.getHttpConnectionManager().closeIdleConnections(0);
//					}
//				}
//				// System.out.println("============================chain.dofilter==========================");
//				chain.doFilter(req, res);
//				return;
//			}
//
//			HttpClient client = new HttpClient();
//			String appId = WXConfig.getAppId(state);
//			String appSecret = WXConfig.getAppSecret(state);
//			GetMethod method = new GetMethod("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code");
//			method.setRequestHeader("Connection", "close");
//			method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
//			try
//			{
//				// Execute the method.
//				int statusCode = client.executeMethod(method);
//				if (statusCode != HttpStatus.SC_OK)
//				{
//					chain.doFilter(req, res);
//					if (method != null)
//					{
//						method.releaseConnection();
//						client.getHttpConnectionManager().closeIdleConnections(0);
//					}
//					return;
//				}
//				// Read the response body.
//				String respStr = method.getResponseBodyAsString();
//				JSONObject rootNode = JSONObject.fromObject(respStr);
//				// 鑾峰彇涓嶅埌锛屽弬鏁伴敊璇垨娌″湪寰俊涓娇鐢�
//				if (rootNode != null)
//				{
//					openId = rootNode.optString("openid");
//					httpRequest.getSession().setAttribute("openId", openId);
//					httpRequest.getSession().setAttribute("tenantId", state);
//					checkWebchatUser(state, openId, req);
//				}
//				else
//				{
//					httpResponse.sendRedirect(ctx_path + "/error.jsp");
//					return;
//				}
//			}
//			catch (Exception e)
//			{
//				e.printStackTrace();
//			}
//			finally
//			{
//				// Release the connection.
//				if (method != null)
//				{
//					method.releaseConnection();
//					client.getHttpConnectionManager().closeIdleConnections(0);
//				}
//			}
//			chain.doFilter(req, res);
//			return;
//		}
//		else
//		{
//			// 濡傛灉openid涓虹┖,杩涜鎺堟潈鑾峰彇openid
//			String authorizeUrl = this.obtainAuthorize(tenantId, url);
//			if (!MyUtil.checkEmpty(authorizeUrl))
//			{
//				httpResponse.sendRedirect(ctx_path + "/error.jsp");
//				return;
//			}
//			else
//			{
//				httpResponse.sendRedirect(authorizeUrl);
//				return;
//			}
//		}
//	}
//
//	public void setFilterConfig(final FilterConfig filterConfig)
//	{
//		this.filterConfig = filterConfig;
//
//	}
//
//	public void destroy()
//	{
//		this.filterConfig = null;// destroy the filter
//	}
//
//	/**
//	 * 澶勭悊寰俊鐢ㄦ埛淇℃伅锛屽鏋滄暟鎹簱涓笉瀛樺湪鐢ㄦ埛淇℃伅鍒欒繘琛屽叆搴撲繚瀛�
//	 * 
//	 * @param tenantId
//	 * @param openId
//	 */
//	public void checkWebchatUser(String tenantId, String openId, ServletRequest request)
//	{
//		HttpServletRequest httpRequest = (HttpServletRequest) request;
//		// if(httpRequest.getSession().getAttribute(SESSION_USER_KEY)!=null){
//		// return;
//		// }
//		logger.debug("-------------------com.zhihuiyanche.dao.user:" + FromRedisUtil.getSessionWechatUser(openId));
//		// System.out.println("-------------------com.zhihuiyanche.dao.user:"+FromRedisUtil.getSessionWechatUser(openId));
//		if (FromRedisUtil.getSessionWechatUser(openId) != null)
//		{
//			return;
//		}
//		
//		MemberDao memberDao = (MemberDao) SpringConext.getApplicationContext().getBean(MemberDao.NAME);
//		try
//		{
//			List<JSONObject> menberList = memberDao.getMemberInfo(tenantId, openId);
//			logger.debug("menberlist------------------:" + menberList);
//			// System.out.println("menberlist------------------:"+menberList);
//			if (menberList != null && menberList.size() > 0)
//			{
//				// httpRequest.getSession().setAttribute(SESSION_USER_KEY,menberList.get(0).getString("id"));
//				boolean setSessionWechatUser = FromRedisUtil.setSessionWechatUser(openId, menberList.get(0).getString("id"));
//				logger.debug("灏嗙敤鎴蜂俊鎭瓨鍏ュ埌redis涓細" + setSessionWechatUser);
//				// System.out.println("灏嗙敤鎴蜂俊鎭瓨鍏ュ埌redis涓細"+setSessionWechatUser);
//			}
//			else
//			{
//				// 鐢ㄦ埛淇℃伅涓嶅瓨鍦紝鍘诲井淇¤幏鍙栫敤鎴蜂俊鎭�濡傛灉鍏虫敞浜嗗叕浼楄处鍙锋妸鏁版嵁瀛樺偍鍒版暟鎹簱琛ㄤ腑
//				Map<String, Object> map = null;
//
//				Boolean wechatAuthorize = FromRedisUtil.getWechatAuthorize(tenantId);
//				if (wechatAuthorize)
//				{
//					map = WXUtil.getInfoByopenId(openId, tenantId);
//				}
//				else
//				{
//					// 绗笁鏂规巿鏉�
//					map = WXThridUtil.getInfoByopenId(openId, tenantId);
//					logger.debug("鐢ㄦ埛淇℃伅锛� + map);
//					// System.out.println("鐢ㄦ埛淇℃伅锛�+map);
//				}
//				int subscribe = (int) map.get("subscribe");
//				if (subscribe == 1)
//				{
//					map.put("subscribe", true);
//					map.put("create_time", DateUtil.formatDate(new Timestamp(System.currentTimeMillis())));
//					map.put("isbind", "false");
//					map.put("iscomplete", "false");
//					map.put("money", "0");
//					map.put("score", "0");
//					map.put("tenancy_id", tenantId);
//					map.put("group_id", "0");
//					map.put("source", "allOrgan");
//					map.put("subscribe_time", DateUtil.formatDate(new Timestamp(System.currentTimeMillis())));
//					JSONObject json = JSONObject.fromObject(map);
//					Object id = memberDao.insertIgnorCase(tenantId, "wx_member", json);
//					// httpRequest.getSession().setAttribute(SESSION_USER_KEY,id);
//					boolean setSessionWechatUser = FromRedisUtil.setSessionWechatUser(openId, ((Integer) id).toString());
//					logger.debug("鏁版嵁搴撲腑娌℃湁璇ョ敤鎴峰皢鐢ㄦ埛淇℃伅瀛樺叆鍒皉edis涓細" + setSessionWechatUser);
//					// System.out.println("鏁版嵁搴撲腑娌℃湁璇ョ敤鎴峰皢鐢ㄦ埛淇℃伅瀛樺叆鍒皉edis涓細"+setSessionWechatUser);
//				}
//				else
//				{
//					// TODO 濡傛灉鐢ㄦ埛鏈叧娉ㄥ叕浼楀彿銆佸緟澶勭悊
//					httpRequest.getSession().setAttribute("wechat_subscribe", false);
//				}
//			}
//		}
//		catch (Exception e1)
//		{
//			e1.printStackTrace();
//		}
//	}
//
//	/**
//	 * 鑾峰彇鎺堟潈鐨剈rl
//	 * 
//	 * @param tenantId
//	 * @return
//	 */
//	public String obtainAuthorize(String tenantId, String url)
//	{
//		
//		ConfigDao configDao = (ConfigDao) SpringConext.getApplicationContext().getBean(ConfigDao.NAME);
//		// 鑾峰彇鍟嗘埛瀵瑰簲鐨刟ppid鐨勪俊鎭�
//		try
//		{
//			List<JSONObject> list = configDao.getConfig(tenantId);
//			if (list != null && list.size() > 0)
//			{
//				JSONObject bean = list.get(0);
//				String result = WechatTokenUtil.getAuthorizeUrl(bean.optString("appid"), url, "snsapi_base", null);
//				return result;
//			}
//		}
//		catch (Exception e)
//		{
//			e.printStackTrace();
//		}
//		return null;
//	}
//}